package chapter01.part7;

import java.util.Optional;

/**
 * Optional<T> 是包装器对象 用来安全处理 null
 *
 * 1. 创建
 * 2. 获取
 * 3. 使用
 * 4. 流化/管道化
 *
 * @author insight 
 * @since 2021/7/19
 */
public class OptionalLearn {
    public static void main(String[] args) {
        /* 创建 of ofNullable empty */
        // empty
        Optional<String> empty = Optional.empty();
        System.out.println(empty);

        // if null throw exception
        Optional<String> optional = Optional.of("123");
        System.out.println(optional);

        Optional<String> notnull = Optional.ofNullable("123");
        System.out.println(notnull);

        // if null get empty
        Optional<String> nullable = Optional.ofNullable(null);
        System.out.println(nullable);

        /* 获取 */
        // if null throw exception
        System.out.println(notnull.get());

        // if null get other
        System.out.println(nullable.orElse("orElse"));

        // if null call other
        System.out.println(nullable.orElseGet(() -> {
            System.out.println("orElseGet");
            return "null";
        }));

        // if null throw exception
        // System.out.println(nullable.orElseThrow(NoSuchElementException::new));

        /* 使用/消费 */
        notnull.ifPresent(System.out::println);
        notnull.ifPresentOrElse(System.out::println,
                () -> System.out.println("dont Present"));

        /* 流化操作 */
        // map && filter
        // if present && match predicate -> return
        // else return empty
        notnull.filter(s -> s.length() > 0).map(String::toLowerCase);

        // if present return
        // else return or
        Optional<String> or = nullable.or(() -> notnull);
    }
}